﻿using BLLUtilidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;

namespace BLLTarasca
{
    public class BLLUsuario:BLLPadre<TarascaDataContext>
    {
        public BLLUsuario(TarascaDataContext contexto) : base(contexto) { }
        public BLLUsuario() : this(new TarascaDataContext()) { }

        public bool Autenticar(string usuario, string contraseñaDesencriptada)
        {
            TA_Usuario usuarioEnCuestion = Traer(usuario);

            if (usuarioEnCuestion.Contraseña.Equals(contraseñaDesencriptada))
                return true;
            else if (usuarioEnCuestion.ContraseñaRecuperacion != null && usuarioEnCuestion.ContraseñaRecuperacion.Equals(contraseñaDesencriptada))
            {
                usuarioEnCuestion.Contraseña = usuarioEnCuestion.ContraseñaRecuperacion;
                usuarioEnCuestion.ContraseñaRecuperacion = null;
                return true;
            }
            else
                return false;
            
        }

        public void CrearUsuario(string usuario, string contraseña, string email)
        {
            if (Existe(usuario))
                throw new BLLTarascaException("Nombre de usuario no disponible: " + usuario);

            TA_Usuario nuevoUsuario = new TA_Usuario();
            nuevoUsuario.Nombre = usuario;
            nuevoUsuario.Contraseña = contraseña;
            Contexto.TA_Usuarios.InsertOnSubmit(nuevoUsuario);

            BLLPerfil bllPerfil = new BLLPerfil(Contexto);
            bllPerfil.CrearPerfil(nuevoUsuario, email);

            BLLCuenta bllCuenta = new BLLCuenta(Contexto);
            bllCuenta.CrearCuenta(nuevoUsuario);
        }

        public bool Existe(string nombreUsuario)
        {
            return Contexto.TA_Usuarios.Where(u => u.Nombre.ToLower().Equals(nombreUsuario.ToLower())).Count() > 0;
        }

        public TA_Usuario Traer(string nombreUsuario)
        {
            return Contexto.TA_Usuarios.Where(u => u.Nombre.ToLower().Equals(nombreUsuario.ToLower())).FirstOrDefault();
        }

        public string GenerarContraseñaDeRecuperacion(string valorChota, out string emailDestino)
        {
            TA_Usuario usuarioEnCuestion;

            try
            {
                MailAddress mail = new MailAddress(valorChota);
                BLLPerfil bllPerfil = new BLLPerfil(Contexto);
                TA_Perfil perfilEnCuestion = bllPerfil.Traer(valorChota);

                if (perfilEnCuestion == null)
                {
                    emailDestino = null;
                    return null;
                }
                    

                usuarioEnCuestion = perfilEnCuestion.TA_Usuario;
            }
            catch 
            {
                usuarioEnCuestion = Traer(valorChota);

                if (usuarioEnCuestion == null)
                {
                    emailDestino = null;
                    return null;
                }
                    
            }

            usuarioEnCuestion.ContraseñaRecuperacion = GenerarContraseñaAleatoria();
            emailDestino = usuarioEnCuestion.TA_Perfils.FirstOrDefault().Email;
            return usuarioEnCuestion.ContraseñaRecuperacion;
        }

        private string GenerarContraseñaAleatoria()
        {
            string contraseña = string.Empty;
            Random ran = new Random();

            for (int i = 0; i < 10; i++)
                contraseña += ran.Next(9).ToString();

            return contraseña;
        }

        public void ActualizarContraseña(string nombreUsuario, string contraseñaActual, string nuevaContraseña)
        {
            if (!Autenticar(nombreUsuario, contraseñaActual))
                throw new BLLTarascaException("La contraseña actual no coincide");

            TA_Usuario usuario = Traer(nombreUsuario);
            usuario.Contraseña = nuevaContraseña;
        }
    }
}
